SQL Injection 的攻擊原理和防範方法


Posted by Wes on 2021-02-28

SQL Injection 是使用 SQL 語法作為輸入的內容。當程式設計忽略字元檢查,輸入的內容就會被當成 SQL 指令來執行,進而存取、竄改資料庫的數據,或者破壞資料庫。通常出現在要求使用者填入表單時,是一種常見的攻擊手法,被俗稱為駭客的填字遊戲。

攻擊原理

假設網站登入驗證的 SQL 查詢語法為

SELECT * FROM `users` WHERE `username` = $user_name AND `password` = $pswd

使用者惡意填入

$user_name = '' OR 1 = 1
$pswd = '' OR 1 = 1

導致原本的 SQL 查詢語法變成

SELECT * FROM `users` WHERE `username` = '' OR 1 = 1 AND `password` = '' OR 1 = 1

實際上執行的 SQL 指令會是

SELECT * FROM `users`

因此就算沒有帳號、密碼,也可以登入網站

防範方法

在 PHP 中可以透過 Prepared Statements 將原本使用字串拼接的部分,改為使用參數傳入值,資料庫不會將參數的內容視為 SQL 指令的一部份來執行,藉此來避免 SQL Injection。

$stmt = $mysqli->prepare("SELECT * FROM `users` WHERE `username` = ? AND `password` = ?");
$stmt->bind_param('ss', $username, $password);
$stmt->execute();

#Security #SQL Injection #SQL #PHP







Related Posts

Print one to nine

Print one to nine

從前端傳資料給後端(GET, POST)、從 PHP 連線到 MySQL 資料庫

從前端傳資料給後端(GET, POST)、從 PHP 連線到 MySQL 資料庫

React Native AppState 狀態介紹

React Native AppState 狀態介紹


Comments